package com.abm.data;

import java.sql.SQLException;
import java.util.List;

import com.abm.dbclases.Category;
import android.content.Context;
import com.abm.dbclases.Client;
import com.abm.dbclases.Product;
import com.abm.dbclases.ProductLog;
import com.j256.ormlite.dao.Dao.CreateOrUpdateStatus;


public class DatabaseManager {
	static private DatabaseManager databaseManager;
	private DataSQLiteHelper dataSQLiteHelper;

	static public void init(Context ctx) {
		if (null == databaseManager) {
			databaseManager = new DatabaseManager(ctx);
		}
	}

	static public DatabaseManager getInstance() {
		return databaseManager;
	}

	private DatabaseManager(Context ctx) {
		dataSQLiteHelper = new DataSQLiteHelper(ctx);
	}

	private DataSQLiteHelper getHelper() {
		return dataSQLiteHelper;
	}

	

	// #######################################################################################
	// PRODUCT
	// #######################################################################################
	
	
	
	public List<Product> getAllproduct() {
		List<Product> list = null;
		try {
			//pedimos una query (consulta) de TODOS los productos accediendo al DAO (mediante el método .getProductDao
			//que nos devuelve el objeto DAO en cuestión, refiriendo a la clase Product), desde el getHelper (método privado declarado 
			//en la linea 30 nos retorna la propiedad de tipo DataSQLiteHelper (de donde obtenemos los 
			//métodos tales como .getProductDao entre otros)
			list = getHelper().getProductDao().queryForAll();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

	public void deleteProductByID(int iD) {
		try {
			getHelper().getProductDao().deleteById(iD);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void addProduct(Product p) {
		try {
			getHelper().getProductDao().create(p);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public boolean updateProduct(Product p) {
		
		boolean ret = false;
		CreateOrUpdateStatus createOrUpdateStatus;
		try {
			createOrUpdateStatus = getHelper().getProductDao()
					.createOrUpdate(p);
			if (createOrUpdateStatus.isUpdated()) {
				return true;
			} else {
				return false;
			}
		} catch (Exception e) {
			e.printStackTrace();
			ret = false;
		}
		return ret;
	}

	public Product getProductByID(int productId) {
		Product p = null;

		try {
			p = getHelper().getProductDao().queryForId(productId);
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return p;
	}
	
	
	
	// #######################################################################################
		// CLIENT
		// #######################################################################################
		
		
		
		public List<Client> getAllclient() {
			List<Client> list = null;
			try {

				list = getHelper().getClientDao().queryForAll();
			} catch (Exception e) {
				e.printStackTrace();
			}
			return list;
		}

		public void deleteClientByID(int iD) {
			try {
				getHelper().getClientDao().deleteById(iD);
			} catch (Exception e) {
				e.printStackTrace();
			}

		}

		public void addClient(Client p) {
			try {
				getHelper().getClientDao().create(p);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		public boolean updateClient(Client p) {
			
			boolean ret = false;
			CreateOrUpdateStatus createOrUpdateStatus;
			try {
				createOrUpdateStatus = getHelper().getClientDao()
						.createOrUpdate(p);
				if (createOrUpdateStatus.isUpdated()) {
					return true;
				} else {
					return false;
				}
			} catch (Exception e) {
				e.printStackTrace();
				ret = false;
			}
			return ret;
		}

		public Client getClientByID(int clientId) {
			Client p = null;

			try {
				p = getHelper().getClientDao().queryForId(clientId);
			} catch (SQLException e) {
				e.printStackTrace();
			}

			return p;
		}
	
	
		
		
		// #######################################################################################
		// CATEGORY
		// #######################################################################################
		
		
		
		public List<Category> getAllCategories() {
			List<Category> list = null;
			try {
				list = getHelper().getCategoryDao().queryForAll();
			} catch (Exception e) {
				e.printStackTrace();
			}
			return list;
		}

		public void deleteCategoryById(int iD) {
			try {
				getHelper().getCategoryDao().deleteById(iD);
			} catch (Exception e) {
				e.printStackTrace();
			}

		}

		public void addCategory(Category p) {
			try {
				getHelper().getCategoryDao().create(p);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		public boolean updateCategory(Category p) {
			
			boolean ret = false;
			CreateOrUpdateStatus createOrUpdateStatus;
			try {
				createOrUpdateStatus = getHelper().getCategoryDao()
						.createOrUpdate(p);
				if (createOrUpdateStatus.isUpdated()) {
					return true;
				} else {
					return false;
				}
			} catch (Exception e) {
				e.printStackTrace();
				ret = false;
			}
			return ret;
		}

		public Category getCategoryByID(int categoryId) {
			Category p = null;

			try {
				p = getHelper().getCategoryDao().queryForId(categoryId);
			} catch (SQLException e) {
				e.printStackTrace();
			}

			return p;
		}
		
		
		public Category getCategoryByName(String catname) {
			try {
				List<Category> list = null;
				list = getHelper().getCategoryDao().queryForEq("catname", catname);
				return list.get(0);
			} catch (Exception e) {
				e.printStackTrace();
			}
			return null;
		}
		
		
		
	
	
	
	////////////////////////
	// Product Log
	////////////////////////
	
	public List<ProductLog> getAllProductLog() {
		List<ProductLog> loglist = null;
		try {
			loglist = getHelper().getProductLogDao().queryForAll();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return loglist;
	}
	
	public void addProductLog(ProductLog p) {
		try {
			getHelper().getProductLogDao().create(p);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


}
